package school;

import java.util.*;

/**
 * @author: jack
 * @date: 2018/10/27 13:4215
 * @version: 0.1
 * @description: <学习list集合类型数据>增、删、改、查
 * @modified: <修改说明>
 **/
public class ListCourse {
    public   List courseList;

    public ListCourse(){
        this.courseList=new ArrayList();

    }

    /**
     * 添加课程
     */
    public void addListCourse(){
        Course cr1=new Course("1","数字逻辑");
        Course cr2=new Course("2","数学");
        Course cr3=new Course("3","语文");

        //添加到list的各种add（）方法,参数不同，使用方式不同

        courseList.add(cr1);
        courseList.add(cr2);
        //通过指定位置,添加数据，位置超过数组大小，会报异常
        courseList.add(2,cr3);

        //创建数组，将数组添加到list的add()方法
        Course[] courseArray={new Course("4","英语"),new Course("5","数据结构")};
        courseList.addAll(Arrays.asList(courseArray));
        //集合类型不管存入什么类型，都会认为是Object类型，取出数据也是Object类型，使用时，需要强制转换
        Course temp= (Course) courseList.get(3);
        Course temp1= (Course) courseList.get(4);
        System.out.println("新添加的课程："+temp.getId()+":"+temp.getame());
        System.out.println("新添加的课程："+temp1.getId()+":"+temp1.getame());

        Course[] courseArray2={new Course("6","java编程"),new Course("7","电子结构")};
        courseList.addAll(2,Arrays.asList(courseArray2));
        Course temp2= (Course) courseList.get(2);
        Course temp3= (Course) courseList.get(3);
        System.out.println("新添加的课程："+temp2.getId()+":"+temp2.getame());
        System.out.println("新添加的课程："+temp3.getId()+":"+temp3.getame());    }

    /**
     *获取list中的元素方法
     */

    public void getList(){
        int size=courseList.size();
        System.out.println("————————可选课程如下————————");
        for(int i=0;i<size;i++){
            Course cr=(Course)courseList.get(i);
            System.out.println("课程"+cr.getId()+"："+cr.getame());
        }
    }

    /**
     * 通过Iterator迭代器访问list,获取元素
     *
     */
    public void testIterator(){
        Iterator it=courseList.iterator();
        System.out.println("—————————通过迭代器访问list课程表—————————");
        while (it.hasNext()){
            Course cr=(Course)it.next();
            System.out.println("课程"+cr.getId()+"："+cr.getame());
        }
    }

    /**
     * 通过for each方法访问list集合，比迭代器更方便
     *
     */
    public void testForeach(){
        System.out.println("—————————通过for each访问list课程表—————————");
        for (Object obj:courseList){
            Course cr=(Course)obj;
            System.out.println("课程"+cr.getId()+"："+cr.getame());
        }
    }

    /**
     * 如何修改list中的元素，set()方法
     *
     */
    public void  testModify(){
        courseList.set(6,new Course("8","毛概"));
    }

    /**
     * 如何删除list中的元素
     *
     */
    public void testRemove(){
        //通过取得相关位置的元素，再删除数据
        Course cr=(Course) courseList.get(4);
        System.out.println("我是课程"+cr.getId()+":"+cr.getame()+" 即将被删除");
        courseList.remove(cr);
        System.out.println("成功删除课程！");
        testForeach();
        //通过传入数组下标位置，即可删除数据，谨慎数据越界
        System.out.println("即将删除位置1上的课程！");
        courseList.remove(1);
        testForeach();
        //删除多个数据
        Course[] cour={(Course)courseList.get(1),(Course)courseList.get(3)};
        System.out.println("即将删除位置1和位置3上的课程！");
        courseList.retainAll(Arrays.asList(cour));
        testForeach();

    }

    /**
     * 测试List的contains方法，查询数据库中是否存在某个数据。
     *contains底层是通过equals来实现比较。
     * 通过重载equals可以实现，课程名字相同即匹配
     */
    public void testListcontains(){
        Course course=(Course) courseList.get(0);
        System.out.println("取得课程："+course.getame());
        System.out.println("备选课程中是否包含："+course.getame()+","+courseList.contains(course));
        //虽然创建的数据都一样，但是new出来的对象比较返回值为false
        //原因：contains底层调用equals方法对比，如果要实现输入课程名称，相同即返回true,则需要重写equals方法
        Course course2=new Course(course.getId(),course.getame());
        System.out.println("新创建课程："+course2.getame());
        System.out.println("备选课程中是否包含："+course2.getame()+","+courseList.contains(course2));
        Scanner scanner=new Scanner(System.in);
        while (true){
            System.out.print("请输入查询的课程名称：");
            String courseName=scanner.next();
            Course course3=new Course();
            course3.setName(courseName);
            if(courseList.contains(course3)){
                System.out.println("备选课程中包含："+course3.getame());
                //indexOf（）方法，获取索引位置，首次出现的索引位置，lastIndexOf()返回从后向前查找到的索引位置
                //原理，底层也是调用equals()方法，比较相同数据，获取相应的索引位置
                //查询不到索引位置，返回-1
                System.out.println("查询课程"+course3.getame()+"的索引位置为："+courseList.indexOf(course3));

            }
            else {
                System.out.println(courseName+"不在课程表中！");
            }
        }
    }


    public static void main(String[] args){
        ListCourse lc=new ListCourse();
        lc.addListCourse();
//        lc.getList();
//        lc.testIterator();
//        lc.testModify();
          lc.testForeach();
//        lc.testRemove();
        lc.testListcontains();
    }


}










